using System;
using Microsoft.SPOT;
using System.Collections;
using GHIElectronics.NETMF.System;
using GHIElectronics.NETMF.FEZ;
using System.Threading;
using System.Xml;
using System.Ext.Xml;
using System.IO;
using MLRobotic.IA.Tools;
namespace MLRobotic.IA
{
    public class Objectif
    {
        //Robot.RobotCouleur couleur;
        public enum TypeObjectif { Bougie, Assiette, Lancement, Cadeau, Intermediaire }
        public const int distanceMinPourAtteindre = 500;
        public const double tetaMinPourAtteindre = 10.05;
        public int Valeur = 0;
        public double Poids = -1;
        const int BougieValue = 8;
        const int AssietteValue = 8;
        const int ZoneLancementValue = 8;
        private int CadeauValue = 12;
        public bool BesoinBalle = false;
        public Queue Trajectoire = new Queue();
        public Position FirstPosition = null;
        public TypeObjectif _type;


        public Objectif(TypeObjectif t, Queue traj) : this(t, false, traj) { }

        public Objectif(TypeObjectif t, Position p) : this(t, p, false) { }

        public Objectif(TypeObjectif t, Position p, bool aInverserver)
            : this(t, aInverserver, new Queue())
        {
            Trajectoire.Enqueue(p);
            if ((Trajectoire != null) && (Trajectoire.Count > 0))
            {
                FirstPosition = PeekFirstPosition(this.Trajectoire);
            }
        }

        public Objectif(TypeObjectif type, bool aInverser,Queue traj)
        {
            _type = type;
            if (type == TypeObjectif.Bougie)
                Valeur = BougieValue;
            else if (type == TypeObjectif.Assiette)
                Valeur = AssietteValue;
            else if (type == TypeObjectif.Cadeau)
                Valeur = CadeauValue;
            else Valeur = ZoneLancementValue;
            if (!aInverser)
            {
                Trajectoire = traj;
            }
            else
            {
                if ((traj != null) && (traj.Count>0))
                {
                    Queue mirroredQueue = new Queue();
                    for (int i = 0; i < traj.Count; i++)
                    {
                        object temp = traj.Dequeue();
                        if (temp is Position)
                        {
                            mirroredQueue.Enqueue(new Position((short)(AireDeJeu.Longueur - ((Position)temp).X), ((Position)temp).X));
                        }
                        else
                            mirroredQueue.Enqueue(temp);
                    }
                    Trajectoire = (Queue)mirroredQueue;
                }
            }
            Poids = Valeur;
            
            BesoinBalle = false;
            if ((Trajectoire != null) && (Trajectoire.Count > 0))
            {
                FirstPosition = PeekFirstPosition(this.Trajectoire);
            }
        }

        public static Position PeekFirstPosition(Queue _queue)
        {
            Queue q = (Queue)_queue.Clone();
            return (Position)q.Dequeue();

        }

        
    }
}
